﻿using System;
using System.Collections.Generic;
using System.Data.Linq;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Web.Mvc;
using GiaoXuLanTranh_MucVu.Models;
using InfoTech.Core.Data.SqlClient;
using InfoTech.Data.Linq;
using InfoTech.LanTranh.MucVu.Bussiness;
using InfoTech.LanTranh.MucVu.Service;
using InfoTech.Mvc.JqGrid;
using InfoTech.Mvc.LanTranh.MucVu.Models;

namespace GiaoXuLanTranh_MucVu.Areas.AdminCP.Controllers
{
    [Authorize]
    public class ManageUserController : Controller
    {
        //
        // GET: /AdminCP/ManageUser/

        #region Users

        public ActionResult Index()
        {
            Header header = new Header();
            header.Common = "ViewUserControl_User_Index";
            header.CurentCommon = "User";
            header.PageTitle = "Quản Lý Người Dùng Và Phân Quyền - Settings";
            header.PageHeader = "Danh Mục Người Dùng - Quản Lý Người Dùng Và Phân Quyền";
            header.Menulv1 = "05";
            header.Menulv2 = "0504";
            ViewData[Header.Key] = header;

            return View();
        }

        public ActionResult Get_List_User()
        {
            GridSettings grid = (GridSettings)GridModelBinder.BindPostModel(HttpContext);
            DataContext dataContext = InfoTech.Core.Service.BaseService.CreateDataContext();
            IQueryable<USER> query = dataContext.GetTable<USER>();

            //filtering
            if (grid.IsSearch)
            {
                //And
                if (grid.Where.groupOp == "AND")
                    foreach (var rule in grid.Where.rules)
                        query = query.Where<USER>(
                            rule.field, rule.data,
                            (WhereOperation)StringEnum.Parse(typeof(WhereOperation), rule.op));
                else
                {
                    //Or
                    var temp = (new List<USER>()).AsQueryable();
                    foreach (var rule in grid.Where.rules)
                    {
                        var t = query.Where<USER>(
                        rule.field, rule.data,
                        (WhereOperation)StringEnum.Parse(typeof(WhereOperation), rule.op));
                        temp = temp.Concat<USER>(t);
                    }
                    //remove repeating records
                    query = temp.Distinct<USER>();
                }
            }

            //sorting
            query = query.OrderBy(grid.SortColumn, grid.SortOrder);

            //count
            var count = query.Count();

            //paging
            var data = query.Skip((grid.PageIndex - 1) * grid.PageSize).Take(grid.PageSize).ToArray();

            //converting in grid format
            var result = new
            {
                total = (int)Math.Ceiling((double)count / grid.PageSize),
                page = grid.PageIndex,
                records = count,
                rows = data.Select(c => new USERModel(c))
            };
            //convert to JSON and return to client
            return Json(result, JsonRequestBehavior.AllowGet);
        }

        public ActionResult AddUser()
        {
            Header header = new Header();
            header.Common = "ViewUserControl_ManageUser_Index";
            header.CurentCommon = "User";
            header.PageTitle = "Quản Lý Người Dùng Và Phân Quyền - Settings";
            header.PageHeader = "Thêm Người Dùng - Quản Lý Người Dùng Và Phân Quyền";
            header.Menulv1 = "05";
            header.Menulv2 = "0504";
            ViewData[Header.Key] = header;

            return View();
        }

        [ValidateInput(false)]
        [HttpPost]
        public ActionResult AddUser(USERModel userModel)
        {
            Header header = new Header();
            header.Common = "ViewUserControl_ManageUser_Index";
            header.CurentCommon = "User";
            header.PageTitle = "Quản Lý Người Dùng Và Phân Quyền - Settings";
            header.PageHeader = "Thêm Người Dùng - Quản Lý Người Dùng Và Phân Quyền";
            header.Menulv1 = "05";
            header.Menulv2 = "0504";
            ViewData[Header.Key] = header;

            if (ModelState.IsValid)
            {
                EXCEPTION ex = new EXCEPTION();
                ex.UPDATETYPE = UpdateType.INSERT;
                if (userModel.PASSWORD == userModel.RETYPEPASSWORD)
                {
                    USER user = userModel;
                    if (USERService.Check_Insert_USER(user))
                    {
                        Exception exception;
                        user.PASSWORD = Encrypt.Encrypte(user.PASSWORD);
                        user.Insert(out exception);
                        if (exception == null)
                        {
                            //ModelState["NAME"].Value = new ValueProviderResult(null, string.Empty, CultureInfo.InvariantCulture);			
                            //userModel.NAME = "";

                            ModelState["USERNAME"].Value = new ValueProviderResult(null, string.Empty,
                                                                                   CultureInfo.InvariantCulture);
                            userModel.USERNAME = "";
                            ModelState["EMAIL"].Value = new ValueProviderResult(null, string.Empty,
                                                                                CultureInfo.InvariantCulture);
                            userModel.EMAIL = "";

                            ex.RESULTTYPE = ResultType.SUCESS;
                            ex.MESSAGE = "Cập nhật thành công";
                        }
                        else
                        {
                            ex.MESSAGE = exception.Message;
                            ex.RESULTTYPE = ResultType.ERROR;
                        }
                    }
                    else
                    {
                        ex.RESULTTYPE = ResultType.ATTENTION;
                        ex.MESSAGE = "Thông tin này đã tồn tại. Vui lòng thử lại sau";
                    }
                }
                else
                {
                    ex.MESSAGE = "Password's not match.";
                    ex.RESULTTYPE = ResultType.ERROR;
                }
                ex.Insert();
                ViewData["Result"] = ex.EXCEPTIONID;
            }
            return View(userModel);
        }

        public ActionResult EditUser(string id)
        {
            Header header = new Header();
            header.Common = "ViewUserControl_ManageUser_Index";
            header.CurentCommon = "User";
            header.PageTitle = "Quản Lý Người Dùng Và Phân Quyền - Settings";
            header.PageHeader = "Cập nhật Người Dùng - Quản Lý Người Dùng Và Phân Quyền";
            header.Menulv1 = "05";
            header.Menulv2 = "0504";
            ViewData[Header.Key] = header;

            Guid guid;
            if (Guid.TryParse(id, out guid))
            {
                USER user = new USER();
                user.USERID = guid;
                user.SelectbyId();
                if (user.IsPersistence)
                {
                    return View(new USERModel(user));
                }
            }
            EXCEPTION exception = new EXCEPTION();
            exception.MESSAGE = "Không tìm thấy thông tin cần cập nhật";
            exception.RESULTTYPE = ResultType.ATTENTION;
            exception.Insert();
            TempData["Result"] = exception.EXCEPTIONID;
            return RedirectToAction("Index");
        }

        [ValidateInput(false)]
        [HttpPost]
        public ActionResult EditUser(USERModel userModel)
        {
            Header header = new Header();
            header.Common = "ViewUserControl_ManageUser_Index";
            header.CurentCommon = "User";
            header.PageTitle = "Quản Lý Người Dùng Và Phân Quyền - Settings";
            header.PageHeader = "Thêm Người Dùng - Quản Lý Người Dùng Và Phân Quyền";
            header.Menulv1 = "05";
            header.Menulv2 = "0504";
            ViewData[Header.Key] = header;

            if (ModelState.IsValid)
            {
                EXCEPTION ex = new EXCEPTION();
                ex.UPDATETYPE = UpdateType.INSERT;
                if (userModel.PASSWORD == userModel.RETYPEPASSWORD)
                {
                    USER user = userModel;
                    USER temp = new USER();
                    temp.USERID = user.USERID;
                    temp.SelectbyId();
                    if (temp.IsPersistence)
                    {
                        user.PASSWORD = temp.PASSWORD;
                        userModel.OLD_PASWORD = temp.PASSWORD;
                    }
                    if (!string.IsNullOrEmpty(userModel.PASSWORD))
                        user.PASSWORD = Encrypt.Encrypte(userModel.PASSWORD);

                    if (USERService.Check_Update_USER(userModel))
                    {
                        Exception exception;

                        user.UpdatebyId(out exception);
                        if (exception == null)
                        {
                            //ModelState["NAME"].Value = new ValueProviderResult(null, string.Empty, CultureInfo.InvariantCulture);			
                            //userModel.NAME = "";
                            ex.RESULTTYPE = ResultType.SUCESS;
                            ex.MESSAGE = "Cập nhật thành công";
                        }
                        else
                        {
                            ex.MESSAGE = exception.Message;
                            ex.RESULTTYPE = ResultType.ERROR;
                        }
                    }
                    else
                    {
                        ex.RESULTTYPE = ResultType.ATTENTION;
                        ex.MESSAGE = "Thông tin này đã tồn tại, hoặc mật khẩu không giống mật khẩu cũ. Vui lòng thử lại sau.";
                    }
                }
                else
                {
                    ex.MESSAGE = "Password's not match.";
                    ex.RESULTTYPE = ResultType.ERROR;
                }
                ex.Insert();
                ViewData["Result"] = ex.EXCEPTIONID;
            }
            return View(userModel);
        }

        public ActionResult DeleteUser(string id)
        {
            if (id != null)
            {
                string[] s = id.Split(',');
                bool isError = false;
                if (USERService.Check_Delete_USER(s))
                {
                    Guid guid;
                    var stringBuilder = new StringBuilder();
                    foreach (string s1 in s)
                    {
                        if (Guid.TryParse(s1, out  guid))
                        {
                            var user = new USER();
                            user.USERID = guid;
                            Exception exception;
                            user.SelectbyId();
                            if (user.IsPersistence)
                            {
                                // Check service here
                                user.DeletebyId(out exception);
                                if (exception != null)
                                {
                                    isError = true;
                                    stringBuilder.AppendLine(exception.Message);
                                }
                            }
                        }
                    }
                }
                else
                {
                    isError = true;
                }
                EXCEPTION ex = new EXCEPTION();
                ex.UPDATETYPE = UpdateType.DELETE;
                if (isError)
                {
                    ex.RESULTTYPE = ResultType.ERROR;
                    ex.MESSAGE = "Thông tin cần xóa hiện đang được sử dụng. Vui lòng thử lại sau";
                }
                else
                {
                    ex.RESULTTYPE = ResultType.SUCESS;
                    ex.MESSAGE = "Cập nhật thành công";
                }
                ex.Insert();
                return JavaScript(String.Format("ShowNotification('{0}','{1}');", Url.Action("Index", "UpdateResult", new { area = "AdminCP" }), ex.EXCEPTIONID));
            }
            return Content("");
        }

        #endregion

        public ActionResult Permission()
        {
            return View();
        }

    }
}
